<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="YdEHQ" id="YdEHQ"><span data-lake-id="ufb03b112" id="ufb03b112">典型回答</span></h1>
  <p data-lake-id="u3d4f36d5" id="u3d4f36d5"><br></p>
  <p data-lake-id="ua86cee56" id="ua86cee56"><span data-lake-id="ub855975e" id="ub855975e">运行时常量池，是runtime constant pool，是Java虚拟机规范中定义的一块逻辑区域，它是方法区的一部分，规范中说明了，它是用于存储常量、符号引用和一些编译期已知的常量数据。</span></p>
  <p data-lake-id="u20095732" id="u20095732"><span data-lake-id="uacae5541" id="uacae5541">​</span><br></p>
  <p data-lake-id="uc347b96a" id="uc347b96a"><span data-lake-id="ucdfbe172" id="ucdfbe172">因为Java虚拟机规范并没有规定要如何实现方法区，所以在不同的HotSpot的JDK版本中，方法区所处的位置是不同的，所以运行时常量池所处的位置也是不一样的。</span></p>
  <p data-lake-id="u627ff0a2" id="u627ff0a2"><span data-lake-id="ub7d78a81" id="ub7d78a81">​</span><br></p>
  <p data-lake-id="u3bcd0f42" id="u3bcd0f42"><br></p>
  <p data-lake-id="u2ade5340" id="u2ade5340"><span data-lake-id="ub1faa834" id="ub1faa834">Java虚拟机规范中还说，字符串字面量不应该重复的存储在运行时常量池中，应该做到可以复用。</span></p>
  <p data-lake-id="u4087938e" id="u4087938e"><span data-lake-id="u6ebca01b" id="u6ebca01b">​</span><br></p>
  <p data-lake-id="u45c2d8ad" id="u45c2d8ad"><span data-lake-id="ud9a20283" id="ud9a20283">但是，以上都是规范，并不是具体实现，而字符串常量池这个东西，就是HotSpot的一种具体实现。</span></p>
  <p data-lake-id="u1ba2cbfe" id="u1ba2cbfe"><span data-lake-id="u9a5fbc14" id="u9a5fbc14">​</span><br></p>
  <p data-lake-id="ucc761370" id="ucc761370"><span data-lake-id="u84da6acf" id="u84da6acf">HotSpot为了复用字符串对象，定义了一个字符串常量池，它是作为字符串对象的缓存池，用于存储所有字面量形式创建的字符串。</span></p>
  <p data-lake-id="ue0f441e4" id="ue0f441e4"><span data-lake-id="u8287523a" id="u8287523a">​</span><br></p>
  <p data-lake-id="u8872e443" id="u8872e443"><span data-lake-id="u9bc03a6e" id="u9bc03a6e">很多人认为字符串常量池和运行时常量池没啥关系，因为他们所处的位置不一样，尤其是在JDK 1.7之后，字符串常量池在堆上，而运行时常量池随着方法区而处于永久代或者元空间。</span></p>
  <p data-lake-id="u8b24f3fc" id="u8b24f3fc"><span data-lake-id="u3cc7d024" id="u3cc7d024">​</span><br></p>
  <p data-lake-id="u04823e38" id="u04823e38"><span data-lake-id="u56c1266d" id="u56c1266d">但是，根据虚拟机规范，字符串常量，需要放在运行时常量池中。所以，我认为</span><strong><span data-lake-id="u9a0cf1c6" id="u9a0cf1c6">字符串池就是运行时常量池的一个逻辑子区域</span></strong><span data-lake-id="u12341dcf" id="u12341dcf">。即字符串池是运行时常量池的分池！</span></p>
  <p data-lake-id="u7578d1f2" id="u7578d1f2"><br></p>
 </body>
</html>